From 9b16af0ce9819a6ccff8be16bdeb2932fe735a2c Mon Sep 17 00:00:00 2001 From: "awilliam@xenbuild.aw" Date: Tue, 9 May 2006 11:42:26 -0600 Subject: [PATCH] [IA64] linux: arch_free_page() add defeinitions of arch_free_page() work around for PG_foreign. xen/ia64 uses PG_arch1. This work around sould be removed once PG_foreign is taken. Signed-off-by: Isaku Yamahata --- .../arch/ia64/xen/hypervisor.c | 5 +++ linux-2.6-xen-sparse/include/asm-ia64/page.h | 38 +++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c b/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c index 91b3bf39b7..5873601b5b 100644 --- a/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c +++ b/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c @@ -285,3 +285,8 @@ EXPORT_SYMBOL(balloon_dealloc_empty_page_range); EXPORT_SYMBOL(balloon_update_driver_allowance); +/////////////////////////////////////////////////////////////////////////// +// PageForeign(), SetPageForeign(), ClearPageForeign() + +struct address_space xen_ia64_foreign_dummy_mapping; + diff --git a/linux-2.6-xen-sparse/include/asm-ia64/page.h b/linux-2.6-xen-sparse/include/asm-ia64/page.h index c791541c7f..e99838c616 100644 --- a/linux-2.6-xen-sparse/include/asm-ia64/page.h +++ b/linux-2.6-xen-sparse/include/asm-ia64/page.h @@ -235,6 +235,41 @@ get_order (unsigned long size) #include #include +// XXX hack! +// Linux/IA64 uses PG_arch_1. +// This hack will be removed once PG_foreign bit is taken. +//#include +#ifdef __ASM_XEN_FOREIGN_PAGE_H__ +# error "don't include include/xen/foreign_page.h!" +#endif + +extern struct address_space xen_ia64_foreign_dummy_mapping; +#define PageForeign(page) \ + ((page)->mapping == &xen_ia64_foreign_dummy_mapping) + +#define SetPageForeign(page, dtor) do { \ + set_page_private((page), (unsigned long)(dtor)); \ + (page)->mapping = &xen_ia64_foreign_dummy_mapping; \ + smp_rmb(); \ +} while (0) + +#define ClearPageForeign(page) do { \ + (page)->mapping = NULL; \ + smp_rmb(); \ + set_page_private((page), 0); \ +} while (0) + +#define PageForeignDestructor(page) \ + ( (void (*) (struct page *)) page_private(page) ) + +#define arch_free_page(_page,_order) \ +({ int foreign = PageForeign(_page); \ + if (foreign) \ + (PageForeignDestructor(_page))(_page); \ + foreign; \ +}) +#define HAVE_ARCH_FREE_PAGE + //XXX xen page size != page size static inline unsigned long @@ -279,6 +314,9 @@ machine_to_phys_for_dma(unsigned long machine) #define set_phys_to_machine(pfn, mfn) do { } while (0) #define xen_machphys_update(mfn, pfn) do { } while (0) +//XXX to compile set_phys_to_machine(vaddr, FOREIGN_FRAME(m)) +#define FOREIGN_FRAME(m) (INVALID_P2M_ENTRY) + #define mfn_to_pfn(mfn) (mfn) #define mfn_to_virt(mfn) (__va((mfn) << PAGE_SHIFT)) #define pfn_to_mfn(pfn) (pfn) -- 2.30.2